package org.Yiran.timetale_re.item;

import net.minecraft.world.item.Item;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
import org.Yiran.timetale_re.Timetale_re;
import org.Yiran.timetale_re.block.BlocksRegister;
import org.Yiran.timetale_re.item.base.DescriptiveItem;
import org.Yiran.timetale_re.item.blockitem.base.DescriptiveBlockItem;
import org.Yiran.timetale_re.item.gem.ChaosGemItem;
import org.Yiran.timetale_re.item.gem.DimensionGemItem;
import org.Yiran.timetale_re.item.gem.EnergyGemItem;
import org.Yiran.timetale_re.item.gem.SpaceGemItem;
import org.Yiran.timetale_re.item.gem.TimeGemItem;
import org.Yiran.timetale_re.item.items.RuneBlueprintBookItem;
import org.Yiran.timetale_re.item.machine.EnergyCrystalBatteryItem;
import org.Yiran.timetale_re.item.rune.base.RuneItem;
import org.Yiran.timetale_re.item.runeblueprint.base.RuneBlueprintItem;
import org.Yiran.timetale_re.item.tool.chisel.*;
import org.Yiran.timetale_re.item.tool.hammer.*;
import org.Yiran.timetale_re.item.tool.screwdriver.BasicScrewdriverItem;
import org.Yiran.timetale_re.item.tool.screwdriver.ImprovedScrewdriverItem;
import org.Yiran.timetale_re.item.tool.screwdriver.EliteScrewdriverItem;
import org.Yiran.timetale_re.item.tool.screwdriver.ProfessionalScrewdriverItem;
import org.Yiran.timetale_re.item.tool.screwdriver.CreativeScrewdriverItem;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.items.attribute.*;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.items.function.RedstoneModuleItem;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.items.function.RotationModuleItem;
import org.Yiran.timetale_re.item.sheet.IronSheetItem;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * 物品注册管理类
 * <p>
 * 该类负责管理模组中所有物品的注册和访问。
 * 使用Forge的DeferredRegister系统来延迟注册物品，确保在正确的时机进行注册。
 * 通过枚举方式管理所有物品，提高代码的可维护性和可扩展性。
 * </p>
 */
public class ItemsRegister {
    
    // ==============================
    // 注册器定义
    // ==============================

    /**
     * 物品延迟注册器
     * <p>
     * 使用Forge的DeferredRegister系统创建物品注册器，
     * 确保物品在适当的时机被注册到游戏系统中。
     * </p>
     */
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Timetale_re.MODID);

    // ==============================
    // 物品枚举管理
    // ==============================

    /**
     * 模组物品枚举
     * <p>
     * 使用枚举方式管理所有模组物品，包含物品名称和创建工厂。
     * 提供统一的注册和访问接口，便于维护和扩展。
     * </p>
     */
    public enum ModItems {
        // 宝石类物品
        /** 时间宝石物品 */
        TIME_GEM("time_gem", TimeGemItem::new, CreativeTab.MAIN),
        /** 次元宝石物品 */
        DIMENSION_GEM("dimension_gem", DimensionGemItem::new, CreativeTab.MAIN),
        /** 空间宝石物品 */
        SPACE_GEM("space_gem", SpaceGemItem::new, CreativeTab.MAIN),
        /** 混沌宝石物品 */
        CHAOS_GEM("chaos_gem", ChaosGemItem::new, CreativeTab.MAIN),
        /** 能晶物品 */
        ENERGY_GEM("energy_gem", EnergyGemItem::new, CreativeTab.MAIN),
        
        // 符文类物品
        /** 符文物品 */
        RUNE("rune", () -> new RuneItem(new Item.Properties().stacksTo(16)), CreativeTab.MAIN),
        
        // 锤子工具类物品
        /** 木锤子物品 */
        WOOD_HAMMER("wood_hammer", WoodHammerItem::new, CreativeTab.TOOLS),
        /** 金锤子物品 */
        GOLD_HAMMER("gold_hammer", GoldHammerItem::new, CreativeTab.TOOLS),
        /** 石锤子物品 */
        STONE_HAMMER("stone_hammer", StoneHammerItem::new, CreativeTab.TOOLS),
        /** 铜锤子物品 */
        COPPER_HAMMER("copper_hammer", CopperHammerItem::new, CreativeTab.TOOLS),
        /** 铝锤子物品 */
        ALUMINUM_HAMMER("aluminum_hammer", AluminumHammerItem::new, CreativeTab.TOOLS),
        /** 铁锤子物品 */
        IRON_HAMMER("iron_hammer", IronHammerItem::new, CreativeTab.TOOLS),
        /** 钢锤子物品 */
        STEEL_HAMMER("steel_hammer", SteelHammerItem::new, CreativeTab.TOOLS),
        /** 钻石锤子物品 */
        DIAMOND_HAMMER("diamond_hammer", DiamondHammerItem::new, CreativeTab.TOOLS),
        /** 钛锤子物品 */
        TITANIUM_HAMMER("titanium_hammer", TitaniumHammerItem::new, CreativeTab.TOOLS),
        /** 下界合金锤子物品 */
        NETHERITE_HAMMER("netherite_hammer", NetheriteHammerItem::new, CreativeTab.TOOLS),

        // 凿子工具类物品
        /** 金凿子物品 */
        GOLD_CHISEL("gold_chisel", GoldChiselItem::new, CreativeTab.TOOLS),
        /** 铜凿子物品 */
        COPPER_CHISEL("copper_chisel", CopperChiselItem::new, CreativeTab.TOOLS),
        /** 铝凿子物品 */
        ALUMINUM_CHISEL("aluminum_chisel", AluminumChiselItem::new, CreativeTab.TOOLS),
        /** 铁凿子物品 */
        IRON_CHISEL("iron_chisel", IronChiselItem::new, CreativeTab.TOOLS),
        /** 钢凿子物品 */
        STEEL_CHISEL("steel_chisel", SteelChiselItem::new, CreativeTab.TOOLS),
        /** 钻石凿子物品 */
        DIAMOND_CHISEL("diamond_chisel", DiamondChiselItem::new, CreativeTab.TOOLS),
        /** 钛凿子物品 */
        TITANIUM_CHISEL("titanium_chisel", TitaniumChiselItem::new, CreativeTab.TOOLS),
        /** 下界合金凿子物品 */
        NETHERITE_CHISEL("netherite_chisel", NetheriteChiselItem::new, CreativeTab.TOOLS),

        // 机器类物品
        /** 能晶电池物品 */
        ENERGY_CRYSTAL_BATTERY("energy_crystal_battery", () -> new EnergyCrystalBatteryItem(new Item.Properties().stacksTo(1)), CreativeTab.MAIN),

        // 其他物品
        /** 石碑物品 */
        STONE_TABLET("stone_tablet", () -> new DescriptiveItem(new Item.Properties().stacksTo(16)), CreativeTab.MAIN),
        /** 符文图纸手册物品 */
        RUNE_BLUEPRINT_BOOK("rune_blueprint_book", () -> new RuneBlueprintBookItem(new Item.Properties().stacksTo(1)), CreativeTab.MAIN),
        /** 符文图纸物品 */
        RUNE_BLUEPRINT("rune_blueprint", () -> new RuneBlueprintItem(new Item.Properties().stacksTo(4)), CreativeTab.MAIN),

        // 起子模块类物品
        /** 基础挖掘模块物品 */
        BASIC_MINING_MODULE("basic_mining_module", BasicMiningModuleItem::new, CreativeTab.MAIN),
        /** 中级挖掘模块物品 */
        ADVANCED_MINING_MODULE("advanced_mining_module", AdvancedMiningModuleItem::new, CreativeTab.MAIN),
        /** 高级挖掘模块物品 */
        ELITE_MINING_MODULE("elite_mining_module", EliteMiningModuleItem::new, CreativeTab.MAIN),
        /** 基础攻击模块物品 */
        BASIC_ATTACK_MODULE("basic_attack_module", BasicAttackModuleItem::new, CreativeTab.MAIN),
        /** 中级攻击模块物品 */
        ADVANCED_ATTACK_MODULE("advanced_attack_module", AdvancedAttackModuleItem::new, CreativeTab.MAIN),
        /** 高级攻击模块物品 */
        ELITE_ATTACK_MODULE("elite_attack_module", EliteAttackModuleItem::new, CreativeTab.MAIN),
        /** 中级红石模块物品 */
        REDSTONE_MODULE("redstone_module", RedstoneModuleItem::new, CreativeTab.MAIN),
        
        /** 朝向模块物品 */
        ROTATION_MODULE("rotation_module", RotationModuleItem::new, CreativeTab.MAIN),

        // 起子类物品
        /** 基础等级起子物品 */
        BASIC_SCREWDRIVER("basic_screwdriver", BasicScrewdriverItem::new, CreativeTab.TOOLS),
        /** 改良等级起子物品 */
        IMPROVED_SCREWDRIVER("improved_screwdriver", ImprovedScrewdriverItem::new, CreativeTab.TOOLS),
        /** 专业等级起子物品 */
        PROFESSIONAL_SCREWDRIVER("professional_screwdriver", ProfessionalScrewdriverItem::new, CreativeTab.TOOLS),
        /** 精英等级起子物品 */
        ELITE_SCREWDRIVER("elite_screwdriver", EliteScrewdriverItem::new, CreativeTab.TOOLS),
        /** 创造等级起子物品 */
        CREATIVE_SCREWDRIVER("creative_screwdriver", CreativeScrewdriverItem::new, CreativeTab.TOOLS),
        
        // 金属板类物品
        /** 铁板物品 */
        IRON_SHEET("iron_sheet", IronSheetItem::new, CreativeTab.MAIN);
        // ==============================
        // 枚举实例变量
        // ==============================

        /** 物品注册名称 */
        private final String name;
        /** 物品创建工厂 */
        private final Supplier<? extends Item> supplier;
        /** 物品注册对象 */
        private RegistryObject<Item> item;
        /** 物品所属创造模式标签页 */
        private final CreativeTab creativeTab;

        // ==============================
        // 枚举构造方法
        // ==============================

        /**
         * 物品枚举构造函数
         * <p>
         * 创建一个新的物品枚举实例，包含物品名称和创建工厂。
         * </p>
         *
         * @param name     物品注册名称
         * @param supplier 物品创建工厂
         */
        ModItems(String name, Supplier<? extends Item> supplier, CreativeTab creativeTab) {
            this.name = name;
            this.supplier = supplier;
            this.creativeTab = creativeTab;
        }

        // ==============================
        // 枚举静态方法
        // ==============================

        /**
         * 注册所有物品
         * <p>
         * 将枚举中定义的所有物品注册到指定的注册器中。
         * </p>
         *
         * @param registry 物品注册器
         */
        public static void register(DeferredRegister<Item> registry) {
            for (ModItems modItem : values()) {
                modItem.item = registry.register(modItem.name, modItem.supplier);
            }
        }

        // ==============================
        // 枚举实例方法
        // ==============================

        /**
         * 获取物品注册对象
         * <p>
         * 返回该物品的注册对象，用于访问已注册的物品实例。
         * </p>
         *
         * @return 物品注册对象
         */
        public RegistryObject<Item> getItem() {
            return item;
        }

        /**
         * 获取物品所属的创造模式标签页
         * <p>
         * 返回该物品应该显示在哪个创造模式标签页中。
         * </p>
         *
         * @return 创造模式标签页
         */
        public CreativeTab getCreativeTab() {
            return creativeTab;
        }

        /**
         * 获取指定创造模式标签页中的所有物品
         * <p>
         * 返回指定创造模式标签页中包含的所有物品列表。
         * </p>
         *
         * @param tab 创造模式标签页
         * @return 指定标签页中的所有物品列表
         */
        public static List<ModItems> getItemsByTab(CreativeTab tab) {
            List<ModItems> items = new ArrayList<>();
            for (ModItems modItem : values()) {
                if (modItem.creativeTab == tab) {
                    items.add(modItem);
                }
            }
            return items;
        }

        /**
         * 获取所有已注册物品列表
         * <p>
         * 返回包含所有已注册物品的列表，用于批量访问物品。
         * </p>
         *
         * @return 所有已注册物品的列表
         */
        public static List<RegistryObject<Item>> getAllItems() {
            List<RegistryObject<Item>> items = new ArrayList<>();
            for (ModItems modItem : values()) {
                if (modItem.item != null) {
                    items.add(modItem.item);
                }
            }
            return items;
        }
    }
    
    // ==============================
    // 创造模式标签页枚举
    // ==============================
    
    /**
     * 创造模式标签页枚举
     * <p>
     * 定义物品可以归属的创造模式标签页类型。
     * </p>
     */
    public enum CreativeTab {
        /** 主标签页 */
        MAIN,
        /** 工具标签页 */
        TOOLS
    }

    // ==============================
    // 静态初始化块
    // ==============================

    /*
      静态初始化块
      <p>
      在类加载时自动注册所有物品。
      </p>
     */
    static {
        ModItems.register(ITEMS);
    }

    // ==============================
    // 物品访问常量
    // ==============================

    // 宝石类物品
    /** 时间宝石物品访问常量 */
    public static final RegistryObject<Item> TIME_GEM = ModItems.TIME_GEM.getItem();
    /** 次元宝石物品访问常量 */
    public static final RegistryObject<Item> DIMENSION_GEM = ModItems.DIMENSION_GEM.getItem();
    /** 空间宝石物品访问常量 */
    public static final RegistryObject<Item> SPACE_GEM = ModItems.SPACE_GEM.getItem();
    /** 混沌宝石物品访问常量 */
    public static final RegistryObject<Item> CHAOS_GEM = ModItems.CHAOS_GEM.getItem();
    /** 能晶物品访问常量 */
    public static final RegistryObject<Item> ENERGY_GEM = ModItems.ENERGY_GEM.getItem();
    
    // 符文类物品
    /** 符文物品访问常量 */
    public static final RegistryObject<Item> RUNE = ModItems.RUNE.getItem();
    
    // 石碑物品
    /** 石碑物品访问常量 */
    public static final RegistryObject<Item> STONE_TABLET = ModItems.STONE_TABLET.getItem();
    
    // 锤子工具类物品
    /** 木锤子物品访问常量 */
    public static final RegistryObject<Item> WOOD_HAMMER = ModItems.WOOD_HAMMER.getItem();
    /** 金锤子物品访问常量 */
    public static final RegistryObject<Item> GOLD_HAMMER = ModItems.GOLD_HAMMER.getItem();
    /** 石锤子物品访问常量 */
    public static final RegistryObject<Item> STONE_HAMMER = ModItems.STONE_HAMMER.getItem();
    /** 铜锤子物品访问常量 */
    public static final RegistryObject<Item> COPPER_HAMMER = ModItems.COPPER_HAMMER.getItem();
    /** 铝锤子物品访问常量 */
    public static final RegistryObject<Item> ALUMINUM_HAMMER = ModItems.ALUMINUM_HAMMER.getItem();
    /** 铁锤子物品访问常量 */
    public static final RegistryObject<Item> IRON_HAMMER = ModItems.IRON_HAMMER.getItem();
    /** 钢锤子物品访问常量 */
    public static final RegistryObject<Item> STEEL_HAMMER = ModItems.STEEL_HAMMER.getItem();
    /** 钻石锤子物品访问常量 */
    public static final RegistryObject<Item> DIAMOND_HAMMER = ModItems.DIAMOND_HAMMER.getItem();
    /** 钛锤子物品访问常量 */
    public static final RegistryObject<Item> TITANIUM_HAMMER = ModItems.TITANIUM_HAMMER.getItem();
    /** 下界合金锤子物品访问常量 */
    public static final RegistryObject<Item> NETHERITE_HAMMER = ModItems.NETHERITE_HAMMER.getItem();
    
    // 凿子工具类物品
    /** 金凿子物品访问常量 */
    public static final RegistryObject<Item> GOLD_CHISEL = ModItems.GOLD_CHISEL.getItem();
    /** 铜凿子物品访问常量 */
    public static final RegistryObject<Item> COPPER_CHISEL = ModItems.COPPER_CHISEL.getItem();
    /** 铝凿子物品访问常量 */
    public static final RegistryObject<Item> ALUMINUM_CHISEL = ModItems.ALUMINUM_CHISEL.getItem();
    /** 铁凿子物品访问常量 */
    public static final RegistryObject<Item> IRON_CHISEL = ModItems.IRON_CHISEL.getItem();
    /** 钢凿子物品访问常量 */
    public static final RegistryObject<Item> STEEL_CHISEL = ModItems.STEEL_CHISEL.getItem();
    /** 钻石凿子物品访问常量 */
    public static final RegistryObject<Item> DIAMOND_CHISEL = ModItems.DIAMOND_CHISEL.getItem();
    /** 钛凿子物品访问常量 */
    public static final RegistryObject<Item> TITANIUM_CHISEL = ModItems.TITANIUM_CHISEL.getItem();
    /** 下界合金凿子物品访问常量 */
    public static final RegistryObject<Item> NETHERITE_CHISEL = ModItems.NETHERITE_CHISEL.getItem();

    /** 基础等级起子物品访问常量 */
    public static final RegistryObject<Item> BASIC_SCREWDRIVER = ModItems.BASIC_SCREWDRIVER.getItem();
    /** 改良等级起子物品访问常量 */
    public static final RegistryObject<Item> IMPROVED_SCREWDRIVER = ModItems.IMPROVED_SCREWDRIVER.getItem();
    /** 精英等级起子物品访问常量 */
    public static final RegistryObject<Item> ELITE_SCREWDRIVER = ModItems.ELITE_SCREWDRIVER.getItem();
    /** 专业等级起子物品访问常量 */
    public static final RegistryObject<Item> PROFESSIONAL_SCREWDRIVER = ModItems.PROFESSIONAL_SCREWDRIVER.getItem();
    /** 创造等级起子物品访问常量 */
    public static final RegistryObject<Item> CREATIVE_SCREWDRIVER = ModItems.CREATIVE_SCREWDRIVER.getItem();
    
    // 起子模块类物品
    /** 基础挖掘模块物品访问常量 */
    public static final RegistryObject<Item> BASIC_MINING_MODULE = ModItems.BASIC_MINING_MODULE.getItem();
    /** 中级挖掘模块物品访问常量 */
    public static final RegistryObject<Item> ADVANCED_MINING_MODULE = ModItems.ADVANCED_MINING_MODULE.getItem();
    /** 高级挖掘模块物品访问常量 */
    public static final RegistryObject<Item> ELITE_MINING_MODULE = ModItems.ELITE_MINING_MODULE.getItem();
    /** 基础攻击模块物品访问常量 */
    public static final RegistryObject<Item> BASIC_ATTACK_MODULE = ModItems.BASIC_ATTACK_MODULE.getItem();
    /** 中级攻击模块物品访问常量 */
    public static final RegistryObject<Item> ADVANCED_ATTACK_MODULE = ModItems.ADVANCED_ATTACK_MODULE.getItem();
    /** 高级攻击模块物品访问常量 */
    public static final RegistryObject<Item> ELITE_ATTACK_MODULE = ModItems.ELITE_ATTACK_MODULE.getItem();
    /** 中级红石模块物品访问常量 */
    public static final RegistryObject<Item> REDSTONE_MODULE = ModItems.REDSTONE_MODULE.getItem();
    
    /** 基础朝向模块物品访问常量 */
    public static final RegistryObject<Item> ROTATION_MODULE = ModItems.ROTATION_MODULE.getItem();
    
    // 机器类物品
    /** 能晶电池物品访问常量 */
    public static final RegistryObject<Item> ENERGY_CRYSTAL_BATTERY = ModItems.ENERGY_CRYSTAL_BATTERY.getItem();
    
    // 金属板类物品
    /** 铁板物品访问常量 */
    public static final RegistryObject<Item> IRON_SHEET = ModItems.IRON_SHEET.getItem();
    
    // 符文图纸类物品
    /** 符文图纸物品访问常量 */
    public static final RegistryObject<Item> RUNE_BLUEPRINT = ModItems.RUNE_BLUEPRINT.getItem();
    /** 符文图纸手册物品访问常量 */
    public static final RegistryObject<Item> RUNE_BLUEPRINT_BOOK = ModItems.RUNE_BLUEPRINT_BOOK.getItem();
}